package com.example.lib_common.view.vm

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.bumptech.glide.util.Executors
import com.example.lib_common.view.model.BaseRepository
import com.example.lib_common.view.model.IResultData
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.newFixedThreadPoolContext
import kotlinx.coroutines.newSingleThreadContext
import kotlinx.coroutines.supervisorScope
import java.util.concurrent.Executors.newFixedThreadPool


//基础ViewModel层
//ViewModel和AndroidViewModel的主页区别在于是否需要上下文对象
//ViewModel中业务:1.利用协程获取网络请求
//               2.利用LiveData或StateFlow来管理数据
//               3.通知View数据变化

//以前使用LiveData米缓存数据，存在数据倒灌问题，官方推荐在Kotlin中使用Flow流,
//如果是Java中官方推荐SingLiveEvent或unPeekLiveData
abstract class BaseViewModel:ViewModel(){
    //定义LiveData緩存数据
    public val mError=MutableLiveData<String>()


    //协程异常处理（线程池）
    private val mExceptionHandler = CoroutineExceptionHandler{ctx,exception->
        Log.e("Coroutine Error","Exception===>\n:${exception.message}")
        mError.postValue("ViewModel层发送异常:"+exception.message)
    }
    //自定义协程作用域，SupervisorJob(）创建独立协程作用域，避免影响父协程和同级协程
    protected val mViewModelScope = CoroutineScope(Dispatchers.Main + SupervisorJob() + mExceptionHandler)

    //自定义协程调度器、、、、、、、、、、实则是一个线程池
    protected val mDispatcher =newFixedThreadPool(10).asCoroutineDispatcher()

    protected val mSingDispatcher = newSingleThreadContext("SingleThreadDispatcher")//使用Kotlin中函数创建单线程池
    protected val mFixedThreadDispatcher = newFixedThreadPoolContext(16,"SingleThreadDispatcher")//使用Kotlin中函数创建固定数量线程池

}